package com_fit.springboot_fit.service.impl;


import com_fit.springboot_fit.entity.AdminUser;
import com_fit.springboot_fit.repository.AdminUserRepository;
import com_fit.springboot_fit.service.AdminUserService;
import com_fit.springboot_fit.util.JwtTokenUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
public class AdminUserServiceImpl implements AdminUserService {


    @Autowired
    private AdminUserRepository userRepository;


    @Autowired
    private JwtTokenUtil jwtTokenUtil; // 注入 token 工具类


    @Value("${admin.password.salt}")
    private String saltPrefix;

    @Override
    public List<AdminUser> findAll() {
        return userRepository.findAll();
    }

    @Override
    public Optional<AdminUser> findById(Integer id) {
        return userRepository.findById(id);
    }

    @Override
    public Optional<AdminUser> findByLoginName(String loginName) {
        return userRepository.findByLoginName(loginName);
    }

    @Override
    @Transactional
    public AdminUser save(AdminUser user) {
        // 如果是新用户，设置添加时间
        if (user.getId() == null) {
            user.setAddTime(new Date());
            user.setLastLoginTime(new Date(0)); // 初始化为 epoch 时间
        }
        return userRepository.save(user);
    }

    @Override
    @Transactional
    public void deleteById(Integer id) {
        userRepository.deleteById(id);
    }

    @Override
    public Map<String, Object> login(String loginName, String password) { // 修改返回值为包含 token 的 Map



        // 1. 查询用户
        Optional<AdminUser> userOpt = userRepository.findByLoginName(loginName);





//        if (user == null) {
//            log.warn("登录失败：用户不存在，loginName={}", loginName);
//            throw new RuntimeException("用户名或密码错误");
//        }
//
//        // 2. 验证密码
//        String encryptedPassword = encryptPassword(password, user.getSalt());
//        if (!encryptedPassword.equals(user.getPasswd())) {
//            log.warn("登录失败：密码错误，loginName={}", loginName);
//            throw new RuntimeException("用户名或密码错误");
//        }
//
//        // 3. 登录成功，生成 token
//        String token = jwtTokenUtil.generateToken(user.getId(), user.getLoginName());
//        log.info("用户登录成功：loginName={}, userId={}", loginName, user.getId());
//
//        // 4. 封装用户信息和 token 返回
        Map<String, Object> result = new HashMap<>();
//        result.put("user", user); // 用户基本信息
//        result.put("token", token); // 生成的 token
//        result.put("expire", jwtTokenUtil.getExpire()); // 过期时间（可选）
        return result;
    }









//    @Override
//    public AdminUser login(String loginName, String password) {
//        Optional<AdminUser> userOpt = findByLoginName(loginName);
//
//
//
//        if (userOpt.isEmpty()) {
//            throw new RuntimeException("用户名不存在");
//        }
//
//        AdminUser user = userOpt.get();
//
//        // 检查用户是否被锁定
//        if (AdminUser.YesNoEnum.yes.equals(user.getIsLock())) {
//            throw new RuntimeException("用户已被锁定");
//        }
//
//        // 检查用户是否显示
//        if (AdminUser.YesNoEnum.no.equals(user.getIsShow())) {
//            throw new RuntimeException("用户不可用");
//        }
//
//        // 检查密码
//        if (checkPassword(user, password)) {
//            throw new RuntimeException("密码错误");
//        }
//
//        // 更新最后登录时间
//        user.setLastLoginTime(new Date());
//        save(user);
//
//        return user;
//    }

    @Override
    public boolean checkPassword(AdminUser user, String password) {
        String encryptedPassword = encryptPassword(password, user.getSalt());
        return !encryptedPassword.equals(user.getPasswd());
    }

    @Override
    public String encryptPassword(String password, String salt) {
        // 密码加密规则：MD5(前缀盐 + 密码 + 用户盐)
        String source = saltPrefix + password + salt;


        return DigestUtils.md5Hex(source);
    }
}
